package com.note.feng.leetcode.algorithms.easy.three;

public class ThreeHundredThree {

    /**
     * 303 区域和检索-数组不可变
     * 给定一个整数数组  nums，处理以下类型的多个查询:
     *
     * 计算索引 left 和 right （包含 left 和 right）之间的 nums 元素的 和 ，其中 left <= right
     * 实现 NumArray 类：
     *
     * NumArray(int[] nums) 使用数组 nums 初始化对象
     * int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ，
     * 包含 left 和 right 两点（也就是 nums[left] + nums[left + 1] + ... + nums[right] )
     *
     * 示例 1：
     *
     * 输入：
     * ["NumArray", "sumRange", "sumRange", "sumRange"]
     * [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
     * 输出：
     * [null, 1, -1, -3]
     *
     * 解释：
     * NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
     * numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
     * numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
     * numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
     *
     * 提示：
     *
     * 1 <= nums.length <= 104
     * -105 <= nums[i] <= 105
     * 0 <= i <= j < nums.length
     * 最多调用 104 次 sumRange 方法
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/range-sum-query-immutable
     */
    /**
     * 解法：
     * 1.计算数组给定范围元素的和，可以每次需要的时候，去计算
     * 2.也可以把从0开始，截止每个下标对应的值的和，存到一个数组中，
     * 每次需要的时候，计算sum[left]和sum[rihgt]的差即可
     */
    class NumArray {

        int [] nums ;

        public NumArray(int[] nums) {
            this.nums = nums;
        }

        public int sumRange(int left, int right) {
            if(left == right){
                return nums[left];
            }
            int res = 0;
            for (int i = left; i <= right; i++) {
                res += nums[i];
            }
            return  res;
        }
    }
}
